package com.icedata.sika.core

/**
 * 处理器接口
 * 用于处理一个T类型的数据并返回一个R类型的返回值
 */
interface Processor<T, R> {

    /**
     * 当处理器被挂载时调用
     */
    fun onMount(sika: Sika)

    /**
     * 当处理器被卸载时调用
     */
    fun onUnmount(sika: Sika)

    /**
     * 处理器的优先等级
     */
    var priority: Int

    /**
     * 处理数据
     */
    fun execute(data: T, sika: Sika): R

}

interface AsyncProcessor<T, R> {

    /**
     * 当处理器被挂载时调用
     */
    fun onMount(sika: Sika)

    /**
     * 当处理器被卸载时调用
     */
    fun onUnmount(sika: Sika)

    /**
     * 处理器的优先等级
     */
    var priority: Int

    suspend fun execute(data: T, sika: Sika): R
}

/**
 * 处理器的抽象实现
 */
abstract class AbstractProcessor<T, R>
constructor(protected val function: (T, Sika) -> R, override var priority: Int = 5000) : Processor<T, R> {

    override fun execute(data: T, sika: Sika): R {
        return function(data, sika)
    }

}

abstract class AbstractAsyncProcessor<T, R>
constructor(protected val function: suspend (T, Sika) -> R, override var priority: Int = 5000) : AsyncProcessor<T, R> {

    override suspend fun execute(data: T, sika: Sika): R {
        return function(data, sika)
    }
}

/**
 * 处理器不唯一异常
 */
class ProcessorsNotUniqueException : Exception()

